portal file chooser: Handle errors
authorMatthias Clasen <mclasen@redhat.com>
Sat, 21 Mar 2020 17:06:10 +0000 (13:06 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 21 Mar 2020 17:16:43 +0000 (13:16 -0400)
Fall back to showing a local file chooser
if we get DBus errors from the portal.

Closes: #2527
gtk/gtkfilechoosernative.c
gtk/gtkfilechoosernativeportal.c
gtk/gtkfilechoosernativeprivate.h

index 4db1a2743a1b2b283f0fc7d9242a6dedc9104e3d..9c6828aaaea89051183dd6c8d336beb082e62d35 100644 (file)
@@ -682,6 +682,13 @@ gtk_file_chooser_native_get_files (GtkFileChooser *chooser)
     }
 }
 
+static void
+portal_error_handler (GtkFileChooserNative *self)
+{
+  self->mode = MODE_FALLBACK;
+  show_dialog (self);
+}
+
 static void
 gtk_file_chooser_native_show (GtkNativeDialog *native)
 {
@@ -700,7 +707,7 @@ gtk_file_chooser_native_show (GtkNativeDialog *native)
 #endif
 
   if (self->mode == MODE_FALLBACK &&
-      gtk_file_chooser_native_portal_show (self))
+      gtk_file_chooser_native_portal_show (self, portal_error_handler))
     self->mode = MODE_PORTAL;
 
   if (self->mode == MODE_FALLBACK)
index 3fa5145f7c663c92e935367620f719e3c5df2f8b..6ee6f276b69cf731f8f5ff459e885687fa5da8d3 100644 (file)
@@ -43,6 +43,7 @@
 #include "gtkfilefilterprivate.h"
 #include "gtkwindowprivate.h"
 
+
 typedef struct {
   GtkFileChooserNative *self;
 
@@ -58,6 +59,7 @@ typedef struct {
   const char *method_name;
 
   GtkWindow *exported_window;
+  PortalErrorHandler error_handler;
 } FilechooserPortalData;
 
 
@@ -188,12 +190,13 @@ open_file_msg_cb (GObject *source_object,
 
   if (reply == NULL)
     {
-      if (!data->hidden)
-        _gtk_native_dialog_emit_response (GTK_NATIVE_DIALOG (self), GTK_RESPONSE_DELETE_EVENT);
-      g_warning ("Can't open portal file chooser: %s", error->message);
+      if (!data->hidden && data->error_handler)
+        {
+          data->error_handler (self);
+          filechooser_portal_data_free (data);
+          self->mode_data = NULL;
+        }
       g_error_free (error);
-      filechooser_portal_data_free (data);
-      self->mode_data = NULL;
       return;
     }
 
@@ -398,7 +401,8 @@ window_handle_exported (GtkWindow  *window,
 }
 
 gboolean
-gtk_file_chooser_native_portal_show (GtkFileChooserNative *self)
+gtk_file_chooser_native_portal_show (GtkFileChooserNative *self,
+                                     PortalErrorHandler    error_handler)
 {
   FilechooserPortalData *data;
   GtkWindow *transient_for;
@@ -428,6 +432,7 @@ gtk_file_chooser_native_portal_show (GtkFileChooserNative *self)
   data = g_new0 (FilechooserPortalData, 1);
   data->self = g_object_ref (self);
   data->connection = connection;
+  data->error_handler = error_handler;
 
   data->method_name = method_name;
 
@@ -470,10 +475,9 @@ gtk_file_chooser_native_portal_hide (GtkFileChooserNative *self)
   data->hidden = TRUE;
 
   if (data->portal_handle)
-    {
-      send_close (data);
-      filechooser_portal_data_free (data);
-    }
+    send_close (data);
+
+  filechooser_portal_data_free (data);
 
   self->mode_data = NULL;
 }
index 5749e663dc00cd071b1b186790c38e97dc72134f..e8630238f6fadd75f6ce55f4bacd4702ae8e7e82 100644 (file)
@@ -61,7 +61,9 @@ void gtk_file_chooser_native_win32_hide (GtkFileChooserNative *self);
 gboolean gtk_file_chooser_native_quartz_show (GtkFileChooserNative *self);
 void gtk_file_chooser_native_quartz_hide (GtkFileChooserNative *self);
 
-gboolean gtk_file_chooser_native_portal_show (GtkFileChooserNative *self);
+typedef void (* PortalErrorHandler) (GtkFileChooserNative *self);
+gboolean gtk_file_chooser_native_portal_show (GtkFileChooserNative *self,
+                                              PortalErrorHandler    error_handler);
 void gtk_file_chooser_native_portal_hide (GtkFileChooserNative *self);
 
 G_END_DECLS